#!/usr/bin/env node
/**
 * 更新版本日志脚本
 * 功能：从CHANGELOG.md中提取版本信息，更新packages/docs/versions/index.md文件
 */

import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';

// 获取当前文件目录
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

// 文件路径
const CHANGELOG_PATH = path.resolve(__dirname, '../CHANGELOG.md');
const VERSION_INDEX_PATH = path.resolve(__dirname, '../packages/docs/versions/index.md');
const VERSION_COMMIT_CONFIG_PATH = path.resolve(__dirname, '../.versionrc.json');
let versionConfigContent = null;

function isUsefulLogHandler(line) {
  if (!versionConfigContent || line.trim() === '') {
    return false;
  }
  const trimmedLine = line.trim();
  // 读取versionConfig.types下所有项的section 加上### 判断trimmedLine是否在其中
  const sectionList = versionConfigContent.types.map((item) => `### ${item.section}`);
  // trimmedLine 包含sectionList中的任意一项
  return sectionList.some((section) => trimmedLine.includes(section));
}

/**
 * 读取并解析CHANGELOG.md文件
 * @returns {Array} 解析后的版本信息数组
 */
function parseChangelog() {
  try {
    const changelogContent = fs.readFileSync(CHANGELOG_PATH, 'utf8');
    const lines = changelogContent.split('\n');
    const versions = [];

    let currentVersion = null;
    let isUsefulLog = false;

    // 手动解析每一行
    for (const line of lines) {
      const trimmedLine = line.trim();

      // 检查是否是版本行（更宽松的匹配规则）
      const versionMatch = trimmedLine.match(/###\s+\[?(v?\d+\.\d+\.\d+)\]?.*?\((\d{4}-\d{2}-\d{2})\)/);
      if (versionMatch) {
        // 保存上一个版本
        if (currentVersion) {
          versions.push(currentVersion);
        }

        // 创建新版本
        const version = versionMatch[1].startsWith('v') ? versionMatch[1] : `v${versionMatch[1]}`;
        currentVersion = {
          version,
          date: versionMatch[2],
          featureTexts: []
        };
        isUsefulLog = false;
        continue;
      }

      // 检查日志中行内容是否是有效部分
      if (isUsefulLogHandler(trimmedLine)) {
        isUsefulLog = true;
        continue;
      }

      // 收集Features中的功能点
      if (currentVersion && isUsefulLog && trimmedLine.startsWith('*')) {
        // 提取功能文本，移除星号
        let featureText = trimmedLine.replace(/^\*\s*/, '').trim();
        // 移除所有格式的提交记录链接，如：([1fc1ffa](...))
        featureText = featureText.replace(/\s*\(\[\w+\]\([^)]+\)\)/g, '').trim();

        currentVersion.featureTexts.push(featureText);
      }
    }

    // 保存最后一个版本
    if (currentVersion) {
      versions.push(currentVersion);
    }

    // 按版本号排序（从新到旧）
    return versions.sort((a, b) => {
      const versionA = a.version.replace('v', '').split('.').map(Number);
      const versionB = b.version.replace('v', '').split('.').map(Number);

      for (let i = 0; i < 3; i++) {
        if (versionA[i] !== versionB[i]) {
          return versionB[i] - versionA[i];
        }
      }
      return 0;
    });
  } catch (error) {
    console.error('解析CHANGELOG.md失败:', error.message);
    return [];
  }
}

/**
 * 生成新的index.md内容
 * @param {Array} versions 版本信息数组
 * @returns {string} 生成的markdown内容
 */
function generateIndexMd(versions) {
  const header = `# 版本日志\n\n本文档记录了 fe-pro-utils 库的所有版本更新内容。\n\n## 版本列表\n\n| 版本 | 发布日期 | 主要更新 |\n|------|----------|----------|`;

  const tableRows = versions
    .map((ver) => {
      // 使用HTML的<br>标签实现表格单元格内换行
      let cleanFeatures = '';
      if (ver.featureTexts.length === 0) {
        cleanFeatures = '-';
      } else if (ver.featureTexts.length === 1) {
        cleanFeatures = ver.featureTexts[0];
      } else {
        cleanFeatures = ver.featureTexts.join('<br>- ');
        cleanFeatures = `- ${cleanFeatures}`;
      }
      return `| ${ver.version} | ${ver.date} | ${cleanFeatures} |`;
    })
    .join('\n');

  return `${header}\n${tableRows}\n`;
}

/**
 * 主函数
 */
function main() {
  try {
    console.log('开始更新版本日志...');
    versionConfigContent = JSON.parse(fs.readFileSync(VERSION_COMMIT_CONFIG_PATH, 'utf8'));
    // 解析CHANGELOG
    const versions = parseChangelog();
    if (versions.length === 0) {
      console.error('未找到有效的版本信息');
      process.exit(1);
    }

    // 生成新的index.md内容
    const newContent = generateIndexMd(versions);

    // 写入文件
    fs.writeFileSync(VERSION_INDEX_PATH, newContent, 'utf8');

    console.log(`成功更新版本日志，共更新 ${versions.length} 个版本`);
    console.log(`更新文件: ${VERSION_INDEX_PATH}`);
  } catch (error) {
    console.error('更新版本日志失败:', error.message);
    process.exit(1);
  }
}

// 执行主函数
main();
